package com.github.pig.auth.config;

import com.github.pig.auth.component.mobile.MobileSecurityConfigurer;
import com.github.pig.common.bean.config.FilterUrlsPropertiesConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;

/**
 * @author lengleng
 * @date 2018/3/10
 */


/**
 * @author HJ
 * @date 2018/3/13
 * Spring Security 控制权限 oauth控制AuthorizationServerConfigurerAdapter
 * 通过 @EnableWebMvcSecurity 注解开启Spring Security的功能
    继承 WebSecurityConfigurerAdapter ，并重写它的方法来设置一些web安全的细节
    configure(HttpSecurity http) 方法
    通过 authorizeRequests() 定义哪些URL需要被保护、哪些不需要被保护。例如以上代码指定了 / 和 /home 不需要任何认证就可以访问，其他的路径都必须通过身份验证。
    通过 formLogin() 定义当需要用户登录时候，转到的登录页面。
    configureGlobal(AuthenticationManagerBuilder auth) 方法，在内存中创建了一个用户，该用户的名称为user，密码为password，用户角色为USER。
 */
@Configuration
@EnableWebSecurity
public class PigSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    @Autowired
    private FilterUrlsPropertiesConfig filterUrlsPropertiesConfig;
    @Autowired
    private MobileSecurityConfigurer mobileSecurityConfigurer;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry =
                http.formLogin().loginPage("/authentication/require") //区别于httpbasic，formLogin().loginPage 指定登录页面，注意重定向次数过多，死循环要身份认证就会跳formLogin方法
                        .loginProcessingUrl("/authentication/form") //让security对应UsernamePasswordAuthenticationFilter过滤器知道，要用当前这个请求处理对应表单过滤，不然默认过滤是/login
                        .and()
                        .authorizeRequests();
        for (String url : filterUrlsPropertiesConfig.getAnon()) {
                       /* .authorizeRequests(); //下面都是授权的配置
        for (String url : filterUrlsPropertiesConifg.getAnon()) {*/
            registry.antMatchers(url).permitAll();
        }
        registry.anyRequest().authenticated() //所有的都需要被认证
                .and()
                .csrf().disable();  //关闭跨站
        http.apply(mobileSecurityConfigurer);
    }
}
